[アップデート]Amazon CodeCatalyst にTerraform用のアクションが追加されました
CodeCatalysのActionsにTerraformテンプレートををAWSアカウントにデプロイするActionが追加されました。
Amazon CodeCatalyst now supports Terraform
何が嬉しい?
- 少ない記述でTerraform CI/CD用のワークフローを作成できるようになった
CodeCatalystワークフローで、terraformのCI/CDを作るにはこれまではワークフローの作り込みが必要でした。 (Github ActionsのActionsがCodeCatalystのワークフロー内で使えるため、そこまで大変ではないかもしれませんが)
今回追加されたActionsを利用することで、少ない記述でTerraform CI/CD用のワークフローを作成できるようになりました。
Community | Bootstrapping your Terraform automation with Amazon CodeCatalyst
やってみた
CodeCatalystプロジェクト・リポジトリ作成
terraform-actions-sample
という名前でプロジェクトを作成します。
プロジェクト内にリポジトリを作成します。リポジトリ名は同様に、terraform-actions-sample
とします。
Terraformのファイルを置くため、.gitignore
はTerraformとします。
Terraformバックエンド用のリソース用意(S3 + DynamoDB)
以下のCloudFormationを使って、Terraformバックエンド用のリソースを作成します。
CloudFormaitonのスタック名とS3バケット名やDynamoDBテーブル名は任意のもので問題ありません。
CloudFormationテンプレート
AWSTemplateFormatVersion: "2010-09-09" Description: S3 & DynamoDB for Terraform Backend Parameters: Name: Description: | Name of the S3 bucket, DynamoDB table; Defaults to "terraform-state-AWS_ACCOUNT_ID" Default: "" Type: String Conditions: GenerateNames: !Equals [!Ref Name, ""] Resources: #------------------------------------------------------------------------------# # S3 #------------------------------------------------------------------------------# StateBucket: Type: AWS::S3::Bucket DeletionPolicy: Retain UpdateReplacePolicy: Retain Properties: BucketName: !If - GenerateNames - !Sub "terraform-state-${AWS::AccountId}" - !Ref Name PublicAccessBlockConfiguration: BlockPublicAcls: true BlockPublicPolicy: true IgnorePublicAcls: true RestrictPublicBuckets: true LifecycleConfiguration: Rules: - Id: ExpireOldVersions NoncurrentVersionExpirationInDays: 90 Status: Enabled VersioningConfiguration: Status: Enabled BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: "AES256" #------------------------------------------------------------------------------# # DynamoDB #------------------------------------------------------------------------------# LockTable: Type: AWS::DynamoDB::Table Properties: TableName: !Ref StateBucket ProvisionedThroughput: ReadCapacityUnits: 1 WriteCapacityUnits: 1 AttributeDefinitions: - AttributeName: "LockID" AttributeType: "S" KeySchema: - AttributeName: "LockID" KeyType: "HASH"
tfファイルの用意
Dev Environment(Cloud9)を作成して、Cloud9を開きます。
Cloud9のコマンドラインコンソールを開いて、作成したリポジトリ配下に移動します。
$ cd terraform-actions-sample $ touch main.tf
main.tf
は以下の内容で用意します。置き換えが必要な箇所は修正してください。
(regionはどこでも問題ありません。)
terraform { backend "s3" { bucket = "<Stateファイルのバケット名>" # 置き換えが必要 key = "terraform.tfstate" region = "us-west-2" dynamodb_table = "<lock用のdynamodbテーブル名>" # 置き換えが必要 } } provider "aws" { region = "us-west-2" } resource "aws_vpc" "main" { cidr_block = "10.0.0.0/16" instance_tenancy = "default" tags = { Name = "codecatalyst-terraform-ations" } }
AWS認証情報をセットして、planが可能か確認します。
export AWS_ACCESS_KEY_ID=<AWSアクセスキー> $ export AWS_SECRET_ACCESS_KEY=<AWSシークレットアクセスキー> $ export AWS_SESSION_TOKEN=<AWSセッショントークン> $ terraform init $ terraform plan
用意できたら、リポジトリにPushします。
$ git add . $ git commit -m "add: tf file" $ git push origin HEAD
パイプライン用のIAMロールの作成
パイプライン用のIAMロールを用意します。
以下のファイルを用意して、AWS CLIでIAMロールを作成します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "codecatalyst.amazonaws.com", "codecatalyst-runner.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
$ aws iam create-role --role-name codecatalyst-terraform-actions --assume-role-policy-document file://assume_role_policy.json $ aws iam attach-role-policy --role-name codecatalyst-terraform-actions --policy-arn arn:aws:iam::aws:policy/AdministratorAccess
作成したIAMロールをCodeCatalystで利用できるように設定します。
CodeCatalystのSpace
-> Settings
> AWS Accounts
-> AWSアカウントID
->Manage roles AWS Management Console
の順番に選択します。
作成したIAMロールを選択して、追加します。
Environmentを作成
CI/CD
-> Environments
->Create environment
を選択します。
名前と接続するAWS Accountを選択して、Environmentを作成します。
Terraform用ワークフローの作成
CodeCatalystのコンソールに戻り、Projectterraform-actions-sample
を選択します。
CI/CD
-> Workflows
-> Create workflow
の順に選択します。
以下を設定して、ワークフローを作成します。
Actionsを選択して、Terraformで検索すると今回のアップデートで追加されたTerraform Community Edition
のワークフローがでてくるため、これを選択します。
以下のように必要な設定を行います。
Name: teraform-plan SchemaVersion: "1.0" # Optional - Set automatic triggers. Triggers: - Type: Push Branches: - main Actions: TerraformPlan: # Identifies the action. Do not modify this value. Identifier: codecatalyst-labs/provision-with-terraform-community@v1.0.0 Environment: Name: dev Connections: - Name:<アカウントID> Role: codecatalyst-terraform-actions # Specifies the source and/or artifacts to pass to the action as input. Inputs: # Optional Sources: - WorkflowSource # This specifies that the action requires this Workflow as a source # Defines the action's properties. Configuration: # Required; type: string; description: The Terraform state table StateTable: <State Table> # Required; type: string; description: The Terraform state file StateKey: terraform.tfstate # Required; type: string; description: The S3 state bucket that hosts the Terraform state file for the deployment. StateBucket: <State Bucket> # Required; type: string; description: The AWS region for the deployment AWSRegion: us-west-2 # Required; type: string; description: The Terraform version to be used by the action TerraformVersion: 1.6.1 # Required; type: string; description: The Terraform operation mode, should be either plan or apply TerraformOperationMode: plan
Workflow編集画面からcommitします。
動作確認
Workflowファイルのcommitが完了すると、Workflow実行が行われます。
内容を確認してみると、Planが実行されていることが分かります。
おわりに
最初はAWSでTerraform CloudやGoogle CloudのInfrastructure Manager的なものを想像していました。
実際は、GitHub ActionsでいうところのActionが追加されたといった内容でした。
今回のアップデートでシンプルな記述でTerraformのPlanとApplyをCI/CD上で行えるようになりました。
AWSのサービスでCI/CDを完結させたい場合、有用だと思いました。
今回追加されたアクション「Terraform Community Edition」ですが、GitHubは見つけられませんでしたがアクションの選択画面からソースを取得することが可能です。
気になる方は中身を見てみるのも、面白いかもしれません。
以上、AWS事業本部の佐藤(@chari7311)でした。